import axios from 'axios'
import wait from './delay'
import Tips from '../utils/tips'
// 多种类型接口处理(根据各自项目进行修改)
// 通用接口业务成功判定条件
const DEF_VALIDATOR = (res) => res.ErrorCode === '000000'

// 请求超时时间
axios.defaults.timeout = 10000
const DEF_DELAY = 300
// 响应拦截器
axios.interceptors.response.use(
  response => {
    if (response.status === 200) {
      return Promise.resolve(response);
    } else {
      return Promise.reject(response);
    }
  },
  // 服务器状态码不是200的情况
  error => {
    if (error.response.status) {
      switch (error.response.status) {
        // 401: 未登录
        // 未登录则跳转登录页面，并携带当前页面的路径
        // 在登录成功后返回当前页面，这一步需要在登录页操作。
        // case 401:
        //   router.replace({
        //     path: '/login',
        //     query: { redirect: router.currentRoute.fullPath }
        //   });
        //   break;
        // 403 token过期
        // 登录过期对用户进行提示
        // 清除本地token和清空vuex中token对象
        // 跳转登录页面
        // case 403:
        //   Toast({
        //     message: '登录过期，请重新登录',
        //     duration: 1000,
        //     forbidClick: true
        //   });
        //   // 清除token
        //   localStorage.removeItem('token');
        //   store.commit('loginSuccess', null);
        //   // 跳转登录页面，并将要浏览的页面fullPath传过去，登录成功后跳转需要访问的页面
        //   setTimeout(() => {
        //     router.replace({
        //       path: '/login',
        //       query: {
        //         redirect: router.currentRoute.fullPath
        //       }
        //     });
        //   }, 1000);
        //   break;
        // 404请求不存在
        case 404:
          Tips.toast({ message: '404网络请求不存在' })
          break
        // 其他错误，直接抛出错误提示
        default:
          Tips.toast({ message: error.response.data.message })
      }
      return Promise.reject(error.response);
    }
  }
);

function requestUrl (url) {
  if (process.env.NODE_ENV === 'development') {
    if (url.startsWith('/api')) {
      url = url.replace('/api', '/testApi')
    }
  }
  return url
}
async function send (url, method, body, options, load, loadMsg, loadID, validator, delay ) {
  const opts = { ...options }
  url = requestUrl(url)
  opts.headers = {
    Accept: 'application/json',
    'Content-Type': 'application/json',
    // 'Authorization': window.$globalHub.$store.state.user.userInfo._id || '',
    ...opts.headers
  }
  window.$globalHub.$store.state.global.showLoading = true
  if (load) {
    Tips.loading(loadMsg)
  }
  // get、delete接口参数params化
  if ((method === 'get' || method === 'delete') && body) {
    opts.params = body
  }
  return axios({method, url, data: body, ...opts }).then(async res => {
    const obj = res.data
    let time = load ? delay : 0
    if (delay > DEF_DELAY) {
      time = delay
    }
    await wait(time)
    // 验证接口结果
    Tips.loaded()
    window.$globalHub.$store.state.global.showLoading = false
    if (obj) {
      return obj
    } else {
      Tips.toast({ message: '未知错误' })
    }
  })
}

export default {
  /**
   * 调用Get接口
   * @param url 接口地址
   * @param body 接口参数
   * @param options axios的options设置（参考https://github.com/mzabriskie/axios）
   * @param load  是否展示loading (true：默认，展示全屏loading框，false：不展示，btn：展示按钮loading)
   * @param loadMsg loading展示文字
   * @param loadID loading按钮标识（用以多个loadingBtn的情况，默认为null）
   * @param validator 业务成功逻辑判断
   * @param delay 接口延迟时间，默认300
   * @param defFail 是否使用默认业务失败处理
   * @param defEx 是否使用默认接口失败处理
   */
  get (url, body, { options = null, load = true, loadMsg = '加载中...', loadID = null, validator = DEF_VALIDATOR, delay = DEF_DELAY } = {}) {
    return send(url, 'get', body, options, load, loadMsg, loadID, validator, delay)
  },
  /**
   * 调用Post接口
   * @param url 接口地址
   * @param body 接口参数
   * @param options axios的options设置（参考https://github.com/mzabriskie/axios）
   * @param load  是否展示loading (true：默认，展示全屏loading框，false：不展示，btn：展示按钮loading)
   * @param loadMsg loading展示文字
   * @param loadID loading按钮标识（用以多个loadingBtn的情况，默认为null）
   * @param validator 业务成功逻辑判断
   * @param delay 接口延迟时间，默认300
   * @param defFail 是否使用默认业务失败处理
   * @param defEx 是否使用默认接口失败处理
   */
  post (url, body, { options = null, load = true, loadMsg = '加载中...', loadID = null, validator = DEF_VALIDATOR, delay = DEF_DELAY} = {}) {
    return send(url, 'post', body, options, load, loadMsg, loadID, validator, delay)
  },
  all (list) {
    return axios.all(list).then(axios.spread((...args) => { return args }))
  }
}
